#pragma once
#include "XCom.h"
#include "XTask.h"
class XServiceHandle;
class XThreadPool;
class XSSLCtx;
class XCOM_API XService : public XTask
{
public:
    XService();
    ~XService();
    // 每个连接创建一个handle，加入线程池
    virtual XServiceHandle *CreateServiceHandle() = 0;
    // 开始服务运行，接受连接任务加入到线程池
    bool Start();
    // 初始化，线程池调用
    virtual bool Init() override final;
    // 设置服务器端口
    void set_server_port_(unsigned short port)
    {
        server_port_ = port;
    }
    // 
    void set_thread_count_(int count){
        thread_count_ = count;
    }
    // 监听，每个连接使用CreateServiceHandle创建一个handle，加入线程池
    void ListenCB(evutil_socket_t cfd, struct sockaddr *addr, int socklen);
    void setSSLCtx(XSSLCtx*ctx){
        m_sslCtx = ctx;
    }
    XSSLCtx*sslCtx(){
        return m_sslCtx;
    }
private:
    // SSL通信的上下文
    XSSLCtx* m_sslCtx = nullptr;
    // 接收用户连接线程池
    XThreadPool *thread_listen_pool_ = nullptr;
    // 处理用户数据线程池
    XThreadPool *thread_client_pool_ = nullptr;
    // 客户端处理线程池线程数量
    int thread_count_ = 1;
    unsigned short server_port_ = 0;
};